//
// Created by mac on 1/28/22.
//

/**
& 与
｜ 或
^ 异或
～ 取反
<<:左移
>>:右移
>>>:无符号右移


原码 反码 补码

10 -> 32位 00000000 00000000 00000000 00001010
10原码:  00000000 00000000 00000000 00001010
-10源码: 10000000 00000000 00000000 00001010

反码：正整数反码等于源码，负整数反码符号位不变，其他位取反
10反码:  00000000 00000000 00000000 00001010
-10反码: 11111111 11111111 11111111 11110101

补码：正整数补码等于源码， 负整数的补码等于反码+1
10补码:  00000000 00000000 00000000 00001010
-10补码: 11111111 11111111 11111111 11110110


为什么使用补码
1. 统一数字0的表示

2. 简化整数加减法的运算

按位取反
～10
对10进行取反(~)运算：
原码 0000 0000 0000 1010
反码 0000 0000 0000 1010
补码 0000 0000 0000 1010
---------------------
取反
补码 1111 1111 1111 0101
反码 1111 1111 1111 0100
原码 1000 0000 0000 1011   1+2+0+8 =11 --> -11

～-9
原码 1000 0000 0000 1001
反码 1111 1111 1111 0110
补码 1111 1111 1111 0111
-----------------------
取反
源码  0000 0000 0000 1000
反码  0000 0000 0000 1000
补码  0000 0000 0000 1000

左移 右移 与符号没关系
<<
>>

>>>
15 0000 0000 0000 1111
15>>1  0000 0000 0000 0111 高位补1
15>>>1 0000 0000 0000 0111

-15     1111 1111 1111 0001
-15>>1  1111 1111 1111 1000 高位补1
-15>>>1 0111 1111 1111 1000 高位补0

&运算 ...
｜运算 ...
^运算 ...

拿到二进制的低16位
n&0xFFFF

拿到二进制的高16位
~ (n^0xFFFF)

测试第i+1位是否是1 (n & 1 << i)

去掉最后一位n&(n-1)

获取最后一位1：
 n&(-n)
 n&~(n-1)
 n^(n&(n-1))

*/